Вычислите
значение функции
Вход. Два целых
числа x, y (0 ≤ x, y ≤ 50).
Выход. Выведите
значение функции f(x, y).
Пример входа 1 |
Пример выхода 1 |
2 3 |
4 |
|
|
Пример входа 2 |
Пример выхода 2 |
34 12 |
6 |
рекурсия
Реализуем
рекурсивную функцию с запоминанием результатов.
Реализация алгоритма
Объявим двумерный
массив для запоминания значений функции: dp[x][y] = f(x, y).
long long
dp[51][51];
Реализация рекурсивной функции f с
запоминанием.
long long
f(int x, int y)
{
if (x <= 0 || y <= 0) return
0;
if (dp[x][y] != -1) return
dp[x][y];
if (x <= y) return
dp[x][y] = f(x - 1,y - 2) + f(x - 2,y - 1) + 2;
return dp[x][y] = f(x - 2,y - 2) + 1;
}
Основная часть программы. Читаем входные данные.
scanf("%d %d",&x,&y);
Инициализируем ячейки массива dp значением -1.
memset(dp,-1,sizeof(dp));
Вызываем функцию f(x,
y) и выводим ее значение.
printf("%lld\n",f(x,y));
Python реализация
Реализация рекурсивной функции f с
запоминанием.
def f(x, y):
if x <= 0 or y <= 0: return 0
if dp[x][y] != -1: return dp[x][y]
if x <= y:
dp[x][y] = f(x - 1, y - 2) + f(x - 2, y - 1) + 2
else:
dp[x][y] = f(x - 2, y - 2) + 1
return dp[x][y]
Основная часть программы. Читаем
входные данные.
x, y = map(int, input().split())
Объявим
двумерный список для запоминания значений функции: dp[x][y] = f(x, y).
Инициализируем ячейки списка значением -1.
dp = [[-1] * 51 for _ in range(51)]
Вызываем функцию f(x,
y) и выводим ее значение.
print(f(x, y))